package com.ruoyi.common.utils.file;

import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import org.apache.poi.util.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;

/**
 * 图片处理工具类
 *
 * @author ruoyi
 */
public class ImageUtils {
	private static String DEFAULT_PREVFIX = "thumb_";
	private static Boolean DEFAULT_FORCE = false;//建议该值为false

    private static final Logger log = LoggerFactory.getLogger(ImageUtils.class);

    public static byte[] getImage(String imagePath) {
        InputStream is = getFile(imagePath);
        try
        {
            return IOUtils.toByteArray(is);
        }
        catch (Exception e)
        {
            log.error("图片加载异常 {}", e);
            return null;
        }
        finally
        {
            IOUtils.closeQuietly(is);
        }
    }

    public static InputStream getFile(String imagePath) {
        try
        {
            byte[] result = readFile(imagePath);
            result = Arrays.copyOf(result, result.length);
            return new ByteArrayInputStream(result);
        }
        catch (Exception e)
        {
            log.error("获取图片异常 {}", e);
        }
        return null;
    }

    /**
     * 读取文件为字节数据
     *
     * @param url 地址
     * @return 字节数据
     */
    public static byte[] readFile(String url) {
        InputStream in = null;
        ByteArrayOutputStream baos = null;
        try
        {
            if (url.startsWith("http"))
            {
                // 网络地址
                URL urlObj = new URL(url);
                URLConnection urlConnection = urlObj.openConnection();
                urlConnection.setConnectTimeout(30 * 1000);
                urlConnection.setReadTimeout(60 * 1000);
                urlConnection.setDoInput(true);
                in = urlConnection.getInputStream();
            }
            else
            {
                // 本机地址
                String localPath = RuoYiConfig.getProfile();
                String downloadPath = localPath + StrUtil.subAfter(url, Constants.RESOURCE_PREFIX,false);
                in = new FileInputStream(downloadPath);
            }
            return IOUtils.toByteArray(in);
        }
        catch (Exception e)
        {
            log.error("获取文件路径异常 {}", e);
            return null;
        }
        finally
        {
            IOUtils.closeQuietly(in);
            IOUtils.closeQuietly(baos);
        }
    }


	/***
	 * 在一张大图张添加小图和文字
	 * @param bigImgPath 大图的路径
	 * @param smallImgPath 小图的路径
	 * @param sx    小图在大图上x抽位置
	 * @param sy    小图在大图上y抽位置
	 * @param content   文字内容
	 * @param cx    文字在大图上y抽位置
	 * @param cy    文字在大图上y抽位置
	 * @param outPathWithFileName 结果输出路径
	 */
	public static void bigImgAddSmallImgAndText(String bigImgPath, String smallImgPath, int sx, int sy, int w,int h,
												String content, int cx, int cy, String outPathWithFileName) throws IOException {

		//主图片的路径
		InputStream is = new FileInputStream(bigImgPath);
		//通过JPEG图象流创建JPEG数据流解码器
		JPEGImageDecoder jpegDecoder = JPEGCodec.createJPEGDecoder(is);
		//解码当前JPEG数据流，返回BufferedImage对象
		BufferedImage buffImg = jpegDecoder.decodeAsBufferedImage();
		//得到画笔对象
		Graphics g = buffImg.getGraphics();
		//小图片的路径
		ImageIcon imgIcon = new ImageIcon(smallImgPath);
		//得到Image对象。
		Image img = imgIcon.getImage();
		//适配小图尺寸
		// 根据原图与要求的缩略图比例，找到最合适的缩略图比例
		int width = img.getWidth(null);
		int height = img.getHeight(null);
//		int w = 150, h = 150;
		if ((width * 1.0) / w < (height * 1.0) / h) {
			if (width > w) {
				h = Integer.parseInt(new java.text.DecimalFormat("0").format(height * w / (width * 1.0)));
				System.out.println("change image's height, width:{" + w + "}, height:{" + h + "}.");
			}
		} else {
			if (height > h) {
				w = Integer.parseInt(new java.text.DecimalFormat("0").format(width * h / (height * 1.0)));
				System.out.println("change image's width,  width:{" + w + "}, height:{" + h + "}.");
			}
		}

		// 将小图片绘到大图片上指定的位置。 参数说明:小图，横坐标位移，纵坐标位移，缩放宽度，缩放高度，不知道-_-||
//        g.drawImage(img, sx, sy, null);
		//调整位置
//		int bigWidth = buffImg.getWidth();
//		sx = bigWidth - 220;
		g.drawImage(img, sx, sy, w, h, null);
		//设置颜色。
		g.setColor(Color.WHITE);
		//最后一个参数用来设置字体的大小
		if (content != null) {
			Font f = new Font("宋体", Font.PLAIN, 25);
			Color mycolor = Color.red;//new Color(0, 0, 255);
			g.setColor(mycolor);
			g.setFont(f);
			g.drawString(content, cx, cy); //表示这段文字在图片上的位置(cx,cy) .第一个是你设置的内容。
		}
		g.dispose();
		OutputStream os = new FileOutputStream(outPathWithFileName);
		//创键编码器，用于编码内存中的图象数据。
		JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os);
		en.encode(buffImg);
		is.close();
		os.close();
	}


	/**
	 * png转jpg
	 *
	 * @param pngPath
	 * @param jpgPath
	 */
	public static void pngToJpg(String pngPath, String jpgPath) {
		BufferedImage bufferedImage;
		try {
			// read image file
			bufferedImage = ImageIO.read(new File(pngPath));
			// create a blank, RGB, same width and height, and a white
			// background
			BufferedImage newBufferedImage = new BufferedImage(
				bufferedImage.getWidth(), bufferedImage.getHeight(),
				BufferedImage.TYPE_INT_RGB);
			// TYPE_INT_RGB:创建一个RBG图像，24位深度，成功将32位图转化成24位
			newBufferedImage.createGraphics().drawImage(bufferedImage, 0, 0,
				Color.WHITE, null);
			// write to jpeg file
			ImageIO.write(newBufferedImage, "jpg", new File(jpgPath));
			System.out.println("Done");
		} catch (IOException e) {
			e.printStackTrace();
		}

	}


	/**
	 * <p>Title: thumbnailImage</p>
	 * <p>Description: 根据图片路径生成缩略图 </p>
	 *
	 * @param imagePath 原图片路径
	 * @param w         缩略图宽
	 * @param h         缩略图高
	 * @param prevfix   生成缩略图的前缀
	 * @param force     是否强制按照宽高生成缩略图(如果为false，则生成最佳比例缩略图)
	 */
	public static void thumbnailImage(String imagePath, int w, int h, String prevfix, boolean force) {
		File imgFile = new File(imagePath);
		if (imgFile.exists()) {
			try {
				// ImageIO 支持的图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
				String types = Arrays.toString(ImageIO.getReaderFormatNames());
				String suffix = null;
				// 获取图片后缀
				if (imgFile.getName().indexOf(".") > -1) {
					suffix = imgFile.getName().substring(imgFile.getName().lastIndexOf(".") + 1);
				}
				// 类型和图片后缀全部小写，然后判断后缀是否合法
				if (suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase()) < 0) {
					System.out.println("Sorry, the image suffix is illegal. the standard image suffix is {}." + types);
					return;
				}
				System.out.println("target image's size, width:{" + w + "}, height:{" + h + "}.");
				Image img = ImageIO.read(imgFile);
				if (!force) {
					// 根据原图与要求的缩略图比例，找到最合适的缩略图比例
					int width = img.getWidth(null);
					int height = img.getHeight(null);
					if ((width * 1.0) / w < (height * 1.0) / h) {
						if (width > w) {
							h = Integer.parseInt(new java.text.DecimalFormat("0").format(height * w / (width * 1.0)));
							System.out.println("change image's height, width:{" + w + "}, height:{" + h + "}.");
						}
					} else {
						if (height > h) {
							w = Integer.parseInt(new java.text.DecimalFormat("0").format(width * h / (height * 1.0)));
							System.out.println("change image's width,  width:{" + w + "}, height:{" + h + "}.");
						}
					}
				}
				BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
				Graphics g = bi.getGraphics();
				g.drawImage(img, 0, 0, w, h, Color.LIGHT_GRAY, null);
				g.dispose();
				String p = imgFile.getPath();
				// 将图片保存在原目录并加上前缀
				ImageIO.write(bi, suffix, new File(p.substring(0, p.lastIndexOf(File.separator)) + File.separator + prevfix + imgFile.getName()));
				System.out.println("缩略图在原路径下生成成功");
			} catch (IOException e) {
				System.out.println("generate thumbnail image failed." + e);
			}
		} else {
			System.out.println("the image is not exist.");
		}
	}


	public static void main(String[] args) throws IOException {
		String bigImg = "D:\\Project\\Java\\yuedou\\111.png";
//        String smallImg = "/Users/chaojiwudi/Desktop/testimg/3299dbcd591742e3b24695e54f9ec1db.png";
		String smallImg = "D:\\Project\\Java\\yuedou\\222.jpg";
		String content = "好久不见，你还好吗";
		String outPath = "D:\\Project\\Java\\yuedou\\333.jpg";
		String outBg = "D:\\Project\\Java\\yuedou\\111.jpg";

//        thumbnailImage("/Users/chaojiwudi/Desktop/testimg/62796873274c4ad784f0754dd264596a.jpg", 200, 600, DEFAULT_PREVFIX, DEFAULT_FORCE);
		//先将大图转成jpg
//		pngToJpg(bigImg, outBg);
//		try {
////			bigImgAddSmallImgAndText(outBg, smallImg, 118, 140, 200,200,null, 700, 700, outPath);
//		} catch (IOException e) {
//			e.printStackTrace();
//		}

	}
}
